package com.lhr.utils;

import com.lhr.entity.Menu;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * @author liHuiRu
 * @date 2023/2/22 9:15
 * @Description: 构建菜单树的工具类
 */
public class MenuTreeBuilder {
    public static List<Menu> build(List<Menu> menus) {
//        List<Menu> menus = this.baseMapper.selectList(null);
        //1.先把一级菜单拿到
        List<Menu> menuList = new ArrayList<>();
        for (Menu menu : menus) {
            //不能用equals
            if (menu.getParentId() == 0) { //0是代表一级菜单
                menuList.add(menu);
            }
        }
        //对一级菜单进行排序
        Collections.sort(menuList, Menu.order());

        //2.循环为一级菜单设置子菜单
        for (Menu menu : menuList) {
            // 参数一 是一级菜单的id 参数二所有的菜单数据
            //一级菜单设置子菜单
            menu.setChildMenus(getChildMenu(menu.getId(), menus));
        }
        return menuList;
    }
    /**
     * 获取子菜单的方法
     *
     * @param id
     * @param menus
     * @return
     */
    private static List<Menu> getChildMenu(Long id, List<Menu> menus) {
        //子菜单
        List<Menu> childList = new ArrayList<>();
        //这里仅仅是设置二级菜单
        for (Menu menu : menus) {
            //遍历所有的菜单，当父级id等于传过来的id的时候，说明当前的菜单属于
            //不能将按钮设置为菜单
            if (menu.getParentId().equals(id) && menu.getType().equals("0")) {
                childList.add(menu);
            }
        }
        //对二级菜单进行排序
        Collections.sort(childList, Menu.order());

        //菜单没有排序 递归没有停止
        for (Menu menu : childList) {
            //将子菜单进行循环(使用递归进行子菜单的)
            menu.setChildMenus(getChildMenu(menu.getId(), menus));
        }
        //停止递归
        if (childList.size() == 0) {
            return null;
        }
//        menus.forEach(menu -> {
//            //遍历所有的菜单，当父级id等于传过来的id的时候，说明当前的菜单属于
//            if (menu.getParentId().equals(id)) {
//                childList.add(menu);
//            }
//        });
        return childList;
    }
}
